package com.carlinfo.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.ResourceBundle;
import java.util.Set;

/**
 * 数据库封装的工具类
 * 缺点
三步一样,只有一步不一样
JDBC连接信息要发生变化;

~将加载驱动放到了静态代码块中
~加获取链接封装到了一个方法中
~将关闭链接封装到了一个方法中;

~导出JAR包
	修改密码:
		将jar中的DbUtil.class文件给拿出来;
		使用Eclipse反编译将源代码获取;(这里面木有注释)
		新建一个Class文件,将源代码贴进去;修改相应的代码
		在硬盘上bin下面找到对应的class文件,重新放到jar里面;
		
~将JDBC的链接信息写到java文件中,low;
~编译前和编译后文件是一样的,(配置文件:properties)
	properties; ====Map使用;
	在javac编译的时候,原样拷贝过去了
	如何获取属性文件中的值呢?;ResourceBundle
 * @author WangshMac
 */
public class DbUtil
{
	/* 获取属性文件的内容 */
	private static ResourceBundle bundle = ResourceBundle.getBundle("system");
	/* 直接赋值 */
	/*private static String driver = "com.mysql.jdbc.Driver" ; 
	private static String url = "jdbc:mysql:///mydata?useSSL=false" ; 
	private static String user = "root" ; 
	private static String password = "123456" ;*/
	private static String driver = bundle.getString("jdbc.driver"); 
	private static String url =  bundle.getString("jdbc.url"); 
	private static String user =  bundle.getString("jdbc.user"); 
	private static String password =  bundle.getString("jdbc.password"); 
	
	/**
	 * 只执行一次;不管new多少次只执行一次;
	 * 而且是最先执行
	 */
	static
	{
		try
		{
			Class.forName(driver);
			System.out.println("==加载驱动成功==");
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
			System.out.println("==加载驱动失败==");
		}
	}
	
	/**
	 * 获取链接
	 * @return
	 */
	public static Connection getConnection()
	{
		try
		{
			return DriverManager.getConnection(url, user, password);
		} catch (SQLException e)
		{
			e.printStackTrace();
			System.out.println("==获取链接失败了==");
		}
		return null ;
	}
	
	/**
	 * 关闭所有链接
	 * 关闭ResultSet
	 * 关闭PreparedStatement
	 * 关闭Connection
	 */
	public static void closeAll(Connection connection, PreparedStatement pst,
			ResultSet rs)
	{
		try
		{
			if(rs != null)
			{
				rs.close();  
				rs = null ; 
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		try
		{
			if(pst != null)
			{
				pst.close();  
				pst = null ; 
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		try
		{
			if(connection != null)
			{
				connection.close();  
				connection = null ; 
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args)
	{
		System.out.println("====");
		/* 参数就是属性文件的名字;注意:木有.properties */
		ResourceBundle bundle = ResourceBundle.getBundle("system");
		/* 参数是=左边的内容 */
		System.out.println("==获取右边的内容=>" + bundle.getString("test"));
		/* 循环属性文件中所有的内容
		 * 返回值:就是属性文件中所有的=左边的内容
		 *  */
		Set<String> keySet = bundle.keySet();
		for (String key : keySet)
		{
			/* ==右边的内容= */
			System.out.println(key + "===>" + bundle.getString(key));
		}
		System.out.println("=============");
		/* 查询所有朝代 */
		String sql = "select * from dynasty " ; 
		/* 调用封装的方法 */
		Connection connection = DbUtil.getConnection() ; 
		PreparedStatement pst = null ;
		ResultSet rs = null ; 
		try
		{
			System.out.println("==connection==>" + connection);
			if(connection != null)
			{
				pst = connection.prepareStatement(sql);
				/* 设置占位符 */
				rs = pst.executeQuery() ; 
				while(rs.next())
				{
					/**
					 * rs.get类型要和数据库列的类型一致;
					 * 如果参数是int:表示的是第几列
					 * 如果参数是String:表示的是别名
					 * 推荐使用别名
					 */
					int id = rs.getInt(1);
					String name = rs.getString("name");
					String captital = rs.getString(3);
					short age = rs.getShort("age");
					Date st1 = rs.getDate("st");
					Date createTime = rs.getTime("createTime");
					/* 时间+时间,一定要用时间戳 */
					Date updateTime = rs.getTimestamp("updateTime");
					System.out.println(id + "\t" + name + "\t" + captital + "\t"
							+ age + "\t" + st1.toLocaleString() + "\t"
							+ createTime.toLocaleString() + "\t" + updateTime.toLocaleString());
				}
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		} finally
		{
			DbUtil.closeAll(connection, pst, rs);
		}
	}
}

